package org.pictual.action;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.pictual.business.vo.CompletoVO;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.ImagenVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.controller.DatabaseImg;
import org.pictual.controller.GoogleSearchImg;
import org.pictual.controller.MyImage;
import org.pictual.controller.WikiObtieneDatos;
import org.pictual.controller.WikiTrataDatos;
import org.pictual.controller.mainPackage.Language;
import org.pictual.service.PictualDelegateFactory;
import org.pictual.util.Cache;
import org.pictual.util.Mail;
import org.pictual.util.PalabraEnTabla;
import org.pictual.util.RequestKeys;
import org.pictual.util.SessionKeys;

public class AddMasivoAction extends Action{

	protected static Logger log= Logger.getLogger(AddMasivoAction.class);
	private IdiomaVO idiomaVO;
	private DefinicionVO definicionVO;
	private PalabraVO palabraVO;
	private ImagenVO[] imagenes = new ImagenVO[6];
	private String cadena_wiki;
	
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		long t1 = System.currentTimeMillis();
		HttpSession session = request.getSession();
		ServletContext context = getServlet().getServletContext();

		
		String[] words;
		
		words = request.getParameter("words").split("\n");
		
		String langLeft = request.getParameter(RequestKeys.FROM);
		String langRight = request.getParameter(RequestKeys.TO);

		List<PalabraEnTabla> listaPalabras = new ArrayList<PalabraEnTabla>();
		
		int idioma = 0, wiki = 0;
		if(langLeft.equals("en")) idioma=1;
		if(langLeft.equals("es")) idioma=2;
		if(langLeft.equals("de")) idioma=3;
		if(langLeft.equals("fr")) idioma=4;
		
		if(langRight.equals("en")) wiki=1;
		if(langRight.equals("es")) wiki=2;
		if(langRight.equals("de")) wiki=3;
		if(langRight.equals("fr")) wiki=4;
		
		ArrayList<String> palabras = new ArrayList<String>();
		for(String word: words){
//			System.out.println("Word: "+word);
			String query = word.trim();

			CompletoVO completo = PictualDelegateFactory.getIdiomaDelegate().selectPalabraCompleta(query, idioma, wiki);

			if(completo==null){
			
				String queryUTF8 = URLEncoder.encode(query, "UTF-8");
				
				log.info("Busco "+word +" en wiki");
				
				cadena_wiki=WikiObtieneDatos.getData(query, langRight);
				
				if(cadena_wiki.isEmpty()){
					log.info("La palabra "+word+" no esta en la wiki "+langRight);
				}else{
					WikiTrataDatos wtd = new WikiTrataDatos(query, cadena_wiki, langRight, langLeft);
					
					log.info("Los datos han sido obtenidos de wiki");
					idiomaVO = wtd.getIdiomaVO();
					definicionVO = wtd.getDefinicionVO();
					palabraVO = wtd.getPalabraVO();
	//				imagenes = wtd.getImagenes();
					log.info("Los datos están en los VO");
					
	//				findImages(word);
					int id = insertInDataBase();
					palabras.add(word);
					PalabraEnTabla pet = new PalabraEnTabla(query, langLeft, langRight, false, id);
					
					listaPalabras.add(pet);
					
					
//					//CACHE
//					Cache <String, CompletoVO> cache = (Cache<String, CompletoVO>) context.getAttribute("cache");
//					String cadenaParaCache = query+"/"+langLeft+"/"+langRight;
//					
//					if(cache == null){
//						log.info("CACHE: No existe cache. Se crea");
//						cache = new Cache<String, CompletoVO>(100);
//						context.setAttribute("cache", cache);
//					}
//					log.info("CACHE: Clave de cache: "+cadenaParaCache);
//					
//					CompletoVO palabraEnCache = cache.get(cadenaParaCache);
//					if (palabraEnCache == null) {
//						log.info("CACHE: No esta en cache");
//						palabraEnCache=new CompletoVO();
//						
//						palabraEnCache.setIdiomaVO(idiomaVO);
//						palabraEnCache.setDefinicionVO(definicionVO);
//						palabraEnCache.setPalabraVO(palabraVO);
//						
//						cache.put(cadenaParaCache, palabraEnCache);
//						
//					}else{
//						log.info("CACHE: Esta en cache");
//						cache.put(cadenaParaCache, palabraEnCache);
//						
//					}
//					//FIN CACHE
				}
			}else{
				log.info("la palabra ya esta en base de datos");
			}
		}
		
		request.getSession().setAttribute(SessionKeys.WORDS, listaPalabras);
		
		//TODO BUSCAR Y AÑADIR EN BASE DE DATOS CON LOS IDIOMAS SELECCIONADOS
		
		
		long t2 = System.currentTimeMillis();
		long t = (t2 - t1)/1000; // en segundos
		log.info("***timeSearchMasiva: LA BUSQUEDA masiva TARDA " + t + " SEGUNDOS");
		Mail.enviar(palabras, Language.resolve(idioma), Language.resolve(wiki), t, false);
		return mapping.findForward("success");
	}
	
	public void findImages(String query, String idioma){
		Vector<MyImage> images = null;
		log.info("descargando imagenes");
		images = GoogleSearchImg.queryForImages(query, idioma);
		int i=0;
		for(MyImage img: images){
			log.info("imagen encontrada");
			imagenes[i]=new ImagenVO();
			imagenes[i].setHeight(img.getHeight());
			imagenes[i].setWidth(img.getWidth());
			imagenes[i].setPath_big(img.getImgRef());
			imagenes[i].setPath_small(img.getImgThumbnail());
			log.info(i+": "+imagenes[i].getPath_big());
			i++;
		}
	}
	
	public int insertInDataBase(){
		for(ImagenVO img: imagenes){
			if(img!=null) PictualDelegateFactory.getImagenDelegate().insertImagen(img);
		}
		if(imagenes[0]!=null) palabraVO.setImagen_1(imagenes[0].getImagen_id());
		if(imagenes[1]!=null) palabraVO.setImagen_2(imagenes[1].getImagen_id());
		if(imagenes[2]!=null) palabraVO.setImagen_3(imagenes[2].getImagen_id());
		if(imagenes[3]!=null) palabraVO.setImagen_4(imagenes[3].getImagen_id());
		if(imagenes[4]!=null) palabraVO.setImagen_5(imagenes[4].getImagen_id());
		if(imagenes[5]!=null) palabraVO.setImagen_6(imagenes[5].getImagen_id());
		
		System.out.println("*******************************************************************************************");
		System.out.println(palabraVO);
		System.out.println(definicionVO);
		System.out.println(idiomaVO);
		
		int palabra_id=PictualDelegateFactory.getPalabraDelegate().insertPalabra(palabraVO);
		definicionVO.setPalabra_id(palabra_id);
		idiomaVO.setPalabra_id(palabra_id);
		
		if(PictualDelegateFactory.getIdiomaDelegate().readIdioma(idiomaVO.getNombre(), idiomaVO.getIdioma())==null)
			PictualDelegateFactory.getIdiomaDelegate().insertIdioma(idiomaVO);
		if(PictualDelegateFactory.getDefinicionDelegate().readDefinicion(definicionVO.getPalabra_id(), definicionVO.getIdioma_origen(), definicionVO.getIdioma_destino())==null)
			PictualDelegateFactory.getDefinicionDelegate().insertDefinicion(definicionVO);
		
		return palabra_id;
	}
}
